package com.yonyou.crm.common.rest.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yonyou.crm.common.json.date.CrmDateMorpher;
import com.yonyou.crm.common.rest.constant.HttpKeyConstant;

public class RequestUtil {

	private final static Logger logger = LoggerFactory.getLogger(RequestUtil.class);

	/**
	 * 获得param对象
	 * @param request http请求对象
	 * @return JSONObject
	 */
	public static JSONObject getParamObject(HttpServletRequest request) {
		try {
			String paramStr = (String)request.getAttribute(HttpKeyConstant.RequestRootKey);
			if (StringUtils.isNoneBlank(paramStr)) {
				return JSONObject.fromObject(paramStr);
			}
		} catch (Exception e) {
			logger.error("RequestUtil-getParamObject：", e);
		}
		return null;
	}
	
	/**
	 * 根据key获取param下的对象
	 * @param request http请求对象
	 * @param key
	 * @return Object
	 */
	public static Object getObject(HttpServletRequest request, String key) {
		JSONObject paramObj = getParamObject(request);
		if (paramObj != null && !paramObj.isNullObject() && paramObj.containsKey(key)) {
			return paramObj.get(key);
		}
		return null;
	}
	
	/**
	 * 获得param下的VO
	 * @param request http请求对象
	 * @param clazz 要转换的vo类型
	 * @return T
	 */
	public static <T> T getVO(HttpServletRequest request, Class<T> clazz) {
		return getVO(request, clazz, null);
	}

	/**
	 * 获得param下的VO，并转换vo中的子实体
	 * @param request http请求对象
	 * @param clazz 要转换的vo类型
	 * @param fieldMap vo中非基本类型字段的类型，key为字段名称，value字段类型
	 * @return T
	 */
	public static <T> T getVO(HttpServletRequest request, Class<T> clazz, Map<String, Class<?>> fieldClassMap) {
		try {
			
			String paramStr = (String)request.getAttribute(HttpKeyConstant.RequestRootKey);
			if (StringUtils.isNoneBlank(paramStr)) {
				return getVO(JSONObject.fromObject(paramStr), clazz, fieldClassMap);
			}
		} catch (Exception e) {
			logger.error("RequestUtil-getVO:", e);
		}
		return null;
	}
	
	/**
	 * 将json对象转换为实体
	 * @param jsonObject json对象
	 * @param clazz 要转换的实体类型
	 * @return T
	 */
	public static <T> T getVO(JSONObject jsonObject, Class<T> clazz) {
		return getVO(jsonObject, clazz, null);
	}
	
	/**
	 * 将json对象转换为实体
	 * @param jsonObject json对象
	 * @param clazz 要转换的实体类型
	 * @param fieldClassMap vo中非基本类型字段的类型，key为字段名称，value字段类型
	 * @return T
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getVO(JSONObject jsonObject, Class<T> clazz, Map<String, Class<?>> fieldClassMap) {
		if (jsonObject != null && !jsonObject.isNullObject()) {
			jsonDateFormate();
			return (T) JSONObject.toBean(jsonObject, clazz, fieldClassMap);
		}
		return null;
	}
	
	/**
	 * 获得param下的VO集合
	 * @param request http请求对象
	 * @param clazz 要转换的vo类型
	 * @return List<T>
	 */
	public static <T> List<T> getVOList(HttpServletRequest request, Class<T> clazz) {
		return getVOList(request, clazz, null);
	}
	
	/**
	 * 获得param下的VO集合，并转换vo下的子实体
	 * @param request http请求对象
	 * @param clazz 要转换的vo类型
	 * @param fieldMap vo中非基本类型字段的类型，key为字段名称，value字段类型
	 * @return List<T>
	 */
	public static <T> List<T> getVOList(HttpServletRequest request, Class<T> clazz, Map<String, Class<?>> fieldClassMap) {
		
		List<T> voList = new ArrayList<T>();
		try {
			
			String paramStr = (String)request.getAttribute(HttpKeyConstant.RequestRootKey);
			if (StringUtils.isNoneBlank(paramStr)) {
				return getVOList(JSONArray.fromObject(paramStr), clazz, fieldClassMap);
			}
		} catch (Exception e) {
			logger.error("RequestUtil-getVOList:", e);
		}
		return voList;
	}
	
	/**
	 * 将json对象列表转换为实体列表
	 * @param jsonArray json对象列表
	 * @param clazz 要转换的实体类型
	 * @return List<T>
	 */
	public static <T> List<T> getVOList(JSONArray jsonArray, Class<T> clazz) {
		return getVOList(jsonArray, clazz, null);
	}
	
	/**
	 * 将json对象列表转换为实体列表
	 * @param jsonArray json对象列表
	 * @param clazz 要转换的实体类型
	 * @param fieldClassMap vo中非基本类型字段的类型，key为字段名称，value字段类型
	 * @return List<T>
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> getVOList(JSONArray jsonArray, Class<T> clazz, Map<String, Class<?>> fieldClassMap) {
		
		jsonDateFormate();
		
		List<T> voList = new ArrayList<T>();
		if (jsonArray != null && jsonArray.size() > 0) {
			
			for (Object obj : jsonArray) {
				voList.add((T)JSONObject.toBean((JSONObject)obj, clazz, fieldClassMap));
			}
		}
		return voList;
	}
	
	/**
	 * json日期格式化
	 * @param formate
	 */
	private static void jsonDateFormate() {
		JSONUtils.getMorpherRegistry().registerMorpher(new CrmDateMorpher());
	}
}
